parser grammar Anasint2;

options {
  language = Java;
  tokenVocab = Analex;
}

@header {
   package Practica5.Flex;
}

entrada: (sentencias) EOF;
sentencias: (bloqueA) separador_seccion (bloqueB) separador_seccion (bloqueC);
 
bloqueA: definicion_flex verbatim;
bloqueB: reglaA reglaB;
bloqueC: funcion funcion; 
definicion_flex: (ID RANGO)(ID RANGO);
verbatim: LEFT_VERBATIM (definicion_c)(definicion_c) RIGHT_VERBATIM;
definicion_c: ((DATO_TIPO | KEYWORD_VOID) ID SEPARADOR);
reglaA: macro macroadd OP_MULT ID OP_INC SEPARADOR;
reglaB: macro OP_SUM ID OP_INC SEPARADOR;
macroadd: (LEFT_PAREN MACRONAME PIPE MACRONAME RIGHT_PAREN);
macro: MACRONAME; 
separador_seccion: SECTION;
funcion: funcion_cabecera (pre_inc_dec|inc_dec|asignacion|funcion_instancia)* (return_statement)? RIGHT_BRACE;
funcion_cabecera: (DATO_TIPO|KEYWORD_VOID) ID LEFT_PAREN (parametros|KEYWORD_VOID) RIGHT_PAREN LEFT_BRACE;
funcion_instancia: ID LEFT_PAREN (valores|COMA valores)* RIGHT_PAREN SEPARADOR; 
funcion_parametro: ID LEFT_PAREN (valores|COMA valores)* RIGHT_PAREN;
parametros: (DATO_TIPO ID (COMA DATO_TIPO ID)*)*;
asignacion: (ID OP_ASSIGN valores) SEPARADOR;
inc_dec: ((ID OP_SUM OP_SUM) | (ID OP_SUB OP_SUB)) SEPARADOR;
pre_inc_dec: OP_INC ID SEPARADOR;
valores: (puntero|STRING|NUMERO|funcion_parametro);
puntero: (OP_MULT)? ID; 
return_statement: KEYWORD_RETURN (NUMERO|ID)? SEPARADOR; 
 